#include "common.h"

GLuint loadTexture(char* filename) {
    GLuint texture;
    SDL_Surface *surface;
    GLenum texture_format;
    GLint nOfColors;
    
    if((surface = SDL_LoadBMP(filename))) { 
    
        // Check that the image's width is a power of 2
        if((surface->w & (surface->w - 1)) != 0)
            fprintf(stderr, "warning: image.bmp's width is not a power of 2\n");
    
        // Also check if the height is a power of 2
        if((surface->h & (surface->h - 1)) != 0)
            fprintf(stderr, "warning: image.bmp's height is not a power of 2\n");
            
        // get the number of channels in the SDL surface
        nOfColors = surface->format->BytesPerPixel;
        if (nOfColors == 4) {
            if (surface->format->Rmask == 0x000000ff)
                texture_format = GL_RGBA;
            else
                texture_format = GL_BGRA_EXT;
        } 
        else if (nOfColors == 3) {
            if (surface->format->Rmask == 0x000000ff)
                texture_format = GL_RGB;
            else
                texture_format = GL_BGR_EXT;
        } 
        else
            fprintf(stderr, "warning: the image is not truecolor..  this will probably break\n");
    
        // Have OpenGL generate a texture object handle for us
        glGenTextures(1, &texture);
    
        // Bind the texture object
        glBindTexture(GL_TEXTURE_2D, texture);
        
        // Set the texture's stretching properties
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        
        // Edit the texture object's image data using the information SDL_Surface gives us
        glTexImage2D(GL_TEXTURE_2D, 0, 3, surface->w, surface->h, 0, 
                      texture_format, GL_UNSIGNED_BYTE, surface->pixels);
    } 
    else {
        fprintf(stderr, "SDL could not load image.bmp: %s\n", SDL_GetError());
        SDL_Quit();
        return -1;
    } 
            
    return texture;
}

std::string trim(std::string str) {
    int debut, fin;

    debut = str.find_first_not_of(" ");
    fin = str.find_last_not_of(" ");

    if (debut == std::string::npos || fin == std::string::npos || fin < debut)
        return "";

    return str.substr(debut, (fin-debut) + 1);
}